package server.estadistica;

import persistencia.*;
import java.sql.*;
import server.*;
import comun.constantes.RECURSOS;

/**
 * <p>Title: </p>
 * <p>Description: </p>
 * <p>Copyright: Copyright (c) 2004</p>
 * <p>Company: </p>
 * @author unascribed
 * @version 1.0
 */

public class ControlEstadistica extends Control{
  private Persistencia persistencia;

  public ControlEstadistica(Persistencia persistencia) {
      this.persistencia = persistencia;
    }

    public ControlEstadistica(Connection conexion) {
      this.conexionSQL = conexion;
    }

    public ResultSet getAccesosPorPersona(Timestamp fechaDesde,Timestamp fechaHasta, Long idPersona, Long idRecurso, Long idAula)
    {
      String sql = "";
      ResultSet accesos = null;
        sql += "select distinct per.ID, TIPO_DOC, NUMERO_DOC,per.NOMBRE,per.APELLIDO,p.ID as ID_PARTICIPANTE,  count(FECHA_YHORA_ENTRADA) as CANTIDAD_ACCESOS ";
        sql += "  from ";
        sql += "    ( ";
        sql += "     ( ";
        sql += "       (PERSONA per inner join PARTICIPANTE p on (per.PERSONA_ID = p.PERSONA_ID) ";
        sql += "       )inner  join AULA a on (a.AULA_ID = p.AULA_ID and a.ID = "+idAula+" and per.ID = "+idPersona+" ) ";
        sql += "     ) ";
        sql += "          left outer join ";
        sql += "     ( ";
        sql += "       SEGUIMIENTO_ACCESO s )on(a.AULA_ID = s.AULA_ID and s.PERSONA_ID = per.PERSONA_ID) ";
        sql += "     ) ";
        sql += "     left outer join         RECURSO r on(s.RECURSO_ID = r.RECURSO_ID ) ";
//        sql += "       where ( r.ID is null or r.ID = "+idRecurso+") and (FECHA_YHORA_ENTRADA >= '"+fechaDesde.toString()+"' and FECHA_YHORA_ENTRADA <= '"+fechaHasta.toString()+"' or FECHA_YHORA_ENTRADA is null)" ; ;
        sql += "        where ((FECHA_YHORA_ENTRADA >= '"+fechaDesde.toString()+"' and FECHA_YHORA_ENTRADA <= '"+fechaHasta.toString()+"' or FECHA_YHORA_ENTRADA is null) ";
        sql += " and r.ID = "+idRecurso ;
        sql += "              )" ;

        sql += "   group by per.ID, TIPO_DOC, NUMERO_DOC, per.APELLIDO, per.NOMBRE ,ID_PARTICIPANTE  ";
        /*JULIAN-ESTADISTICAS*/
        sql += " order by per.APELLIDO, per.NOMBRE ";
        /*JULIAN-ESTADISTICAS*/

        //System.out.println("");
        //System.out.println(sql);
        //System.out.println("");
        accesos = this.ejecutarSQL(sql);
        
        return accesos;

    }


    /**
     * Detalle de Accesos por persona a un Aula
     * @param fechaDesde
     * @param fechaHasta
     * @param idPersona
     * @param idRecurso
     * @param idAula
     * @return
     */
    public ResultSet getDetallesAccesosPorPersona(String fechaDesde,String fechaHasta, Long idPersona, Long idRecurso, Long idAula)
    {
      String sql = "";
      ResultSet accesos = null;
        sql += "select distinct per.ID, TIPO_DOC, NUMERO_DOC,per.NOMBRE,per.APELLIDO,FECHA_YHORA_ENTRADA, HOST ";
        sql += "  from ";
        sql += "    ( ";
        sql += "     ( ";
        sql += "       (PERSONA per inner join PARTICIPANTE p on (per.PERSONA_ID = p.PERSONA_ID) ";
        sql += "       )inner  join AULA a on (a.AULA_ID = p.AULA_ID and a.ID = "+idAula+" and per.ID = "+idPersona+" ) ";
        sql += "     ) ";
        sql += "          inner join ";
        sql += "     ( ";
        sql += "       SEGUIMIENTO_ACCESO s )on(a.AULA_ID = s.AULA_ID and s.PERSONA_ID = per.PERSONA_ID) ";
        sql += "     ) ";
        sql += "     inner join         RECURSO r on(s.RECURSO_ID = r.RECURSO_ID ) ";
        sql += "       where ( r.ID is null or r.ID = "+idRecurso+") and (FECHA_YHORA_ENTRADA >= '"+fechaDesde+"' and FECHA_YHORA_ENTRADA <= '"+fechaHasta+"' or FECHA_YHORA_ENTRADA is null)" ; ;
        sql += "   order by FECHA_YHORA_ENTRADA ";

        //System.out.println("");
        //System.out.println(sql);
        //System.out.println("");
        accesos = this.ejecutarSQL(sql);

        return accesos;

    }



    /**
     * Accesos por persona a una  comision
     * @param fechaDesde
     * @param fechaHasta
     * @param idPersona
     * @param idRecurso
     * @param idComision
     * @return
     */
    public ResultSet getAccesosPorPersonaComision(Timestamp fechaDesde,Timestamp fechaHasta, Long idPersona, Long idRecurso, Long idComision)
    {
      String sql = "";
      ResultSet accesos = null;
       sql += " select distinct per.ID, TIPO_DOC, NUMERO_DOC,per.NOMBRE,per.APELLIDO, p.ID as ID_PARTICIPANTE, count(FECHA_YHORA_ENTRADA) as CANTIDAD_ACCESOS ";
       sql += "   from ";
       sql += "    ( ";
       sql += "     ( ";
       sql += "      ( ";
       sql += "       ( ";
       sql += "        ( ";
       sql += "          PERSONA per inner join PARTICIPANTE p on (per.PERSONA_ID = p.PERSONA_ID) ";
       sql += "        ) ";
       sql += "        inner join PARTICIPANTE_COMISION using(PARTICIPANTE_ID) ";
       sql += "        ) ";
       sql += "       inner join COMISION c using (COMISION_ID) ";
       sql += "       ) ";
       sql += "       inner  join AULA a on (a.AULA_ID = c.COMISION_ID and a.ID = "+idComision+" and per.ID = "+idPersona+" ) ";
       sql += "       ) ";
       sql += "       left outer join ";
       sql += "      ( ";
       sql += "        SEGUIMIENTO_ACCESO s )on(a.AULA_ID = s.AULA_ID and s.PERSONA_ID = per.PERSONA_ID) ";
       sql += "      ) ";
       sql += "      left outer join         RECURSO r on(s.RECURSO_ID = r.RECURSO_ID ) ";
       sql += "    where ( r.ID is null or r.ID = "+idRecurso+") and (FECHA_YHORA_ENTRADA >= '"+fechaDesde.toString()+"' and FECHA_YHORA_ENTRADA <= '"+fechaHasta.toString()+"' or FECHA_YHORA_ENTRADA is null) " ;
       sql += "  group by per.ID, TIPO_DOC, NUMERO_DOC, per.APELLIDO, per.NOMBRE ,ID_PARTICIPANTE ";
       /*JULIAN-ESTADISTICAS*/
       sql += " order by per.APELLIDO, per.NOMBRE ";
       /*JULIAN-ESTADISTICAS*/
        //System.out.println("");
        //System.out.println(sql);
        //System.out.println("");
        accesos = this.ejecutarSQL(sql);

        return accesos;
    }



    /**
     * Accesos por persona a una  comision
     * @param fechaDesde
     * @param fechaHasta
     * @param idPersona
     * @param idRecurso
     * @param idComision
     * @return
     */
    public ResultSet getDetalleAccesosPorPersonaComision(String fechaDesde,String fechaHasta, Long idPersona, Long idRecurso, Long idComision)
    {
      String sql = "";
      ResultSet accesos = null;
       sql += " select distinct per.ID, TIPO_DOC, NUMERO_DOC,per.NOMBRE,per.APELLIDO,FECHA_YHORA_ENTRADA, HOST ";
       sql += "   from ";
       sql += "    ( ";
       sql += "     ( ";
       sql += "      ( ";
       sql += "       ( ";
       sql += "        ( ";
       sql += "          PERSONA per inner join PARTICIPANTE p on (per.PERSONA_ID = p.PERSONA_ID) ";
       sql += "        ) ";
       sql += "        inner join PARTICIPANTE_COMISION using(PARTICIPANTE_ID) ";
       sql += "        ) ";
       sql += "       inner join COMISION c using (COMISION_ID) ";
       sql += "       ) ";
       sql += "       inner  join AULA a on (a.AULA_ID = c.COMISION_ID and a.ID = "+idComision+" and per.ID = "+idPersona+" ) ";
       sql += "       ) ";
       sql += "       left outer join ";
       sql += "      ( ";
       sql += "        SEGUIMIENTO_ACCESO s )on(a.AULA_ID = s.AULA_ID and s.PERSONA_ID = per.PERSONA_ID) ";
       sql += "      ) ";
       sql += "      left outer join         RECURSO r on(s.RECURSO_ID = r.RECURSO_ID ) ";
       sql += "    where ( r.ID is null or r.ID = "+idRecurso+") and (FECHA_YHORA_ENTRADA >= '"+fechaDesde+"' and FECHA_YHORA_ENTRADA <= '"+fechaHasta+"' or FECHA_YHORA_ENTRADA is null) " ;
       sql += "  order by  FECHA_YHORA_ENTRADA";

        //System.out.println("");
        //System.out.println(sql);
        //System.out.println("");
        accesos = this.ejecutarSQL(sql);

        return accesos;
    }




    /**
     * devuelve la cantidad de accesos de cada usuario
     * @param fechaDesde
     * @param fechaHasta
     * @param idRecurso
     * @param idTipoUsuario tipo de usuario que se pide en la consulta
     * @param idAula
     * @return
     */
 public ResultSet getAccesosPorTipoUsuario(Timestamp fechaDesde,Timestamp fechaHasta, Long idRecurso, Long idTipoUsuario, Long idAula)
 {
   String sql = "";
   ResultSet accesos = null;
     sql += "select distinct per.ID, TIPO_DOC, NUMERO_DOC,per.NOMBRE,per.APELLIDO, count(FECHA_YHORA_ENTRADA) as CANTIDAD_ACCESOS from ";
     sql += "    ( ";
     sql += "     ( ";
     sql += "      ( ";
     sql += "       ( ";
     sql += "        PERSONA per inner join ";
     sql += "         PARTICIPANTE p on (per.PERSONA_ID = p.PERSONA_ID) ";
     sql += "        ) ";
     sql += "         inner  join AULA a using(AULA_ID) ";
     sql += "       ) ";
     sql += "        inner join TIPO_USUARIO t on(t.TIPO_USUARIO_ID=p.TIPO_USUARIO_ID and t.ID = "+idTipoUsuario+" and a.ID = "+idAula+") ";
     sql += "       ) ";
     sql += "        LEFT outer join ";
     sql += "         ( ";
     sql += "            SEGUIMIENTO_ACCESO s ";
     sql += "          )on(a.AULA_ID = s.AULA_ID and s.PERSONA_ID = per.PERSONA_ID) ";
     sql += "       ) ";
     sql += "       left outer join ";
     sql += "        RECURSO r on(s.RECURSO_ID = r.RECURSO_ID ) ";
     sql += "      where ( r.ID is null or r.ID = "+idRecurso+") ";
     sql += "              and (FECHA_YHORA_ENTRADA >= '"+fechaDesde.toString()+"' and FECHA_YHORA_ENTRADA <= '"+fechaHasta.toString()+"' or FECHA_YHORA_ENTRADA is null)" ;
     sql += "         group by per.ID, TIPO_DOC, NUMERO_DOC, per.APELLIDO, per.NOMBRE ";
     /*JULIAN-ESTADISTICAS*/
     sql += " order by per.APELLIDO, per.NOMBRE ";
     /*JULIAN-ESTADISTICAS*/

     //System.out.println("");
     //System.out.println(sql);
     //System.out.println("");
     accesos = this.ejecutarSQL(sql);

    return accesos;
 }


 public ResultSet getAccesosPorTipoRecursoPorPersona(Timestamp fechaDesde,Timestamp fechaHasta,Long idPersona,Long idComision)
 {
  try {
    String sql = "";
     ResultSet resultado = null;
    // OBTENGO EL ID INTERNO(EL GENERADO POR tjdo) DE LA PERSONA
     sql =  "select distinct PERSONA_ID from PERSONA where ID = "+idPersona;
     resultado = this.ejecutarSQL(sql);
     resultado.next();
     String idPersonaTjdo = resultado.getString("PERSONA_ID");

     sql =  "select distinct AULA_ID from AULA where ID = "+idComision;
     resultado = this.ejecutarSQL(sql);
     resultado.next();
     String idAulaTjdo = resultado.getString("AULA_ID");

     sql =  "select distinct r.NOMBRE, r.ID, count(FECHA_YHORA_ENTRADA) as CANTIDAD_ACCESOS ";
     sql +=  " from ";
     sql +=  "   RECURSO r ";
     sql +=  "    left outer join ";
     sql +=  "   SEGUIMIENTO_ACCESO s ";
     sql +=  "   on(r.RECURSO_ID = s.RECURSO_ID and s.AULA_ID = "+idAulaTjdo+" and PERSONA_ID = "+idPersonaTjdo+") ";
//     sql += "     where (FECHA_YHORA_ENTRADA >= '"+fechaDesde.toString()+"' and FECHA_YHORA_ENTRADA <= '"+fechaHasta.toString()+"' or FECHA_YHORA_ENTRADA is null)" ;
   sql += "        where ((FECHA_YHORA_ENTRADA >= '"+fechaDesde.toString()+"' and FECHA_YHORA_ENTRADA <= '"+fechaHasta.toString()+"' or FECHA_YHORA_ENTRADA is null) ";
     sql +=  this.generarFiltroRecursos("r.nombre");
     sql += "              )" ;
     sql +=  "   group by r.NOMBRE, r.ID";

     //System.out.println("");
     //System.out.println(sql);
     //System.out.println("");
     resultado = this.ejecutarSQL(sql);

     return resultado;
  }
  catch (Exception ex) {
    ex.printStackTrace();
    persistencia.rollback();
    return null;
  }
 }



 /**
  * devuelve la cantidad de accesos por tipo de recurso
  * @param fechaDesde
  * @param fechaHasta
  * @param idRecurso
  * @param idTipoUsuario tipo de usuario que se pide en la consulta
  * @param idAula
  * @return
  */
public ResultSet getAccesosPorTipoRecurso(Timestamp fechaDesde,Timestamp fechaHasta, Long idTipoUsuario, Long idAula)
{
String sql = "";
ResultSet accesos = null;
try
{
  sql += "select distinct r.NOMBRE, r.ID, count(FECHA_YHORA_ENTRADA) as CANTIDAD_ACCESOS from ";
  sql += "    ( ";
  sql += "     ( ";
  sql += "      ( ";
  sql += "       ( ";
  sql += "        PERSONA per inner join ";
  sql += "         PARTICIPANTE p on (per.PERSONA_ID = p.PERSONA_ID) ";
  sql += "        ) ";
  sql += "         inner  join AULA a using(AULA_ID) ";
  sql += "       ) ";
  sql += "        inner join TIPO_USUARIO t on(t.TIPO_USUARIO_ID=p.TIPO_USUARIO_ID and t.ID = "+idTipoUsuario+" and a.ID = "+idAula+") ";
  sql += "       ) ";
  sql += "        LEFT outer join ";
  sql += "         ( ";
  sql += "            SEGUIMIENTO_ACCESO s ";
  sql += "          )on(a.AULA_ID = s.AULA_ID and s.PERSONA_ID = per.PERSONA_ID) ";
  sql += "       ) ";
  sql += "       right outer join ";
  sql += "        RECURSO r on(s.RECURSO_ID = r.RECURSO_ID ) ";
//  sql += "        where (FECHA_YHORA_ENTRADA >= '"+fechaDesde.toString()+"' and FECHA_YHORA_ENTRADA <= '"+fechaHasta.toString()+"' or FECHA_YHORA_ENTRADA is null)" ;

  sql += "        where ((FECHA_YHORA_ENTRADA >= '"+fechaDesde.toString()+"' and FECHA_YHORA_ENTRADA <= '"+fechaHasta.toString()+"' or FECHA_YHORA_ENTRADA is null) ";
  sql +=  this.generarFiltroRecursos("r.nombre");
  sql += "              )" ;
  sql += "         group by r.NOMBRE, r.ID ";

  //System.out.println("");
  //System.out.println(sql);
  //System.out.println("");
  accesos = this.ejecutarSQL(sql);

 return accesos;

}
catch (Exception ex) {
  ex.printStackTrace();
  persistencia.rollback();
  return null;
}
}


 /**
  * devuelve la cantidad de accesos de cada usuario
  * @param fechaDesde
  * @param fechaHasta
  * @param idRecurso
  * @param idTipoUsuario tipo de usuario que se pide en la consulta
  * @param idComision
  * @return
  */
 public ResultSet getAccesosPorTipoUsuarioComision(Timestamp fechaDesde,Timestamp fechaHasta, Long idRecurso, Long idTipoUsuario, Long idComision)
 {
   String sql = "";
   ResultSet accesos = null;
     sql ="   select distinct per.ID, TIPO_DOC, NUMERO_DOC,per.NOMBRE,per.APELLIDO, count(FECHA_YHORA_ENTRADA) as CANTIDAD_ACCESOS from ";
     sql +="   ( ";
     sql +="    ( ";
     sql +="     ( ";
     sql +="      ( ";
     sql +="       ( ";
     sql +="        ( ";
     sql +="         PERSONA per inner join PARTICIPANTE p on (per.PERSONA_ID = p.PERSONA_ID) ";
     sql +="        ) ";
     sql +="        inner join PARTICIPANTE_COMISION using(PARTICIPANTE_ID) ";
     sql +="       ) ";
     sql +="       inner join COMISION c using (COMISION_ID) ";
     sql +="      ) ";
     sql +="       inner  join AULA a on (a.AULA_ID = c.COMISION_ID) ";
     sql +="     ) ";
     sql +="     inner join TIPO_USUARIO t on(t.TIPO_USUARIO_ID = p.TIPO_USUARIO_ID and t.ID = "+idTipoUsuario+" and a.ID = "+idComision+") ";
     sql +="    ) ";
     sql +="    left outer join ";
     sql +="    ( ";
     sql +="     SEGUIMIENTO_ACCESO s)on(a.AULA_ID = s.AULA_ID and s.PERSONA_ID = per.PERSONA_ID) ";
     sql +="    ) ";
     sql +="    left outer join RECURSO r on(s.RECURSO_ID = r.RECURSO_ID ) ";
     sql +=" where ( r.ID is null or r.ID = "+idRecurso+") and ( FECHA_YHORA_ENTRADA >= '"+fechaDesde.toString()+"' and FECHA_YHORA_ENTRADA <= '"+fechaHasta.toString()+"' or FECHA_YHORA_ENTRADA is null) ";
     sql += "         group by per.ID, TIPO_DOC, NUMERO_DOC, per.APELLIDO, per.NOMBRE ";
     /*JULIAN-ESTADISTICAS*/
     sql += " order by per.APELLIDO, per.NOMBRE ";
     /*JULIAN-ESTADISTICAS*/

     //System.out.println("");
     //System.out.println(sql);
     //System.out.println("");
     accesos = this.ejecutarSQL(sql);

     return accesos;
 }





 /**
  * devuelve la cantidad de accesos por cada tipo de recurso
  * @param fechaDesde
  * @param fechaHasta
  * @param idRecurso
  * @param idTipoUsuario tipo de usuario que se pide en la consulta
  * @param idComision
  * @return
  */
 public ResultSet getAccesosPorTipoRecursoComision(Timestamp fechaDesde,Timestamp fechaHasta, Long idTipoUsuario, Long idComision)
 {
   String sql = "";
   ResultSet accesos = null;
   try
   {
     sql +=" select distinct r.NOMBRE, r.ID, count(FECHA_YHORA_ENTRADA) as CANTIDAD_ACCESOS from ";
     sql +="   ( ";
     sql +="    ( ";
     sql +="     ( ";
     sql +="      ( ";
     sql +="       ( ";
     sql +="        ( ";
     sql +="         PERSONA per inner join PARTICIPANTE p on (per.PERSONA_ID = p.PERSONA_ID) ";
     sql +="        ) ";
     sql +="        inner join PARTICIPANTE_COMISION using(PARTICIPANTE_ID) ";
     sql +="       ) ";
     sql +="       inner join COMISION c using (COMISION_ID) ";
     sql +="      ) ";
     sql +="       inner  join AULA a on (a.AULA_ID = c.COMISION_ID) ";
     sql +="     ) ";
     sql +="     inner join TIPO_USUARIO t on(t.TIPO_USUARIO_ID = p.TIPO_USUARIO_ID and t.ID = "+idTipoUsuario+" and a.ID = "+idComision+") ";
     sql +="    ) ";
     sql +="    left outer join ";
     sql +="    ( ";
     sql +="     SEGUIMIENTO_ACCESO s)on(a.AULA_ID = s.AULA_ID and s.PERSONA_ID = per.PERSONA_ID) ";
     sql +="    ) ";
     sql +="     right outer join RECURSO r on(s.RECURSO_ID = r.RECURSO_ID ) ";
//     sql +=" where ( FECHA_YHORA_ENTRADA >= '"+fechaDesde.toString()+"' and FECHA_YHORA_ENTRADA <= '"+fechaHasta.toString()+"' or FECHA_YHORA_ENTRADA is null) ";
     sql += " where ((FECHA_YHORA_ENTRADA >= '"+fechaDesde.toString()+"' and FECHA_YHORA_ENTRADA <= '"+fechaHasta.toString()+"' or FECHA_YHORA_ENTRADA is null) ";
     sql +=  this.generarFiltroRecursos("r.nombre");
     sql += "              )" ;

     sql +=" group by r.NOMBRE, r.ID ";

     //System.out.println("");
     //System.out.println(sql);
     //System.out.println("");
     accesos = this.ejecutarSQL(sql);

     return accesos;

   }
   catch (Exception ex) {
     ex.printStackTrace();
     persistencia.rollback();
     return null;
   }
 }

 private String generarFiltroRecursos(String nombreCampo)
 {
   String filtro = " and (";
   for (int i = 0; i < RECURSOS.LISTA_DE_RECURSOS_PARA_ESTADISTICAS.length; i++) {
     filtro += nombreCampo+" = '"+RECURSOS.LISTA_DE_RECURSOS_PARA_ESTADISTICAS[i]+"' or ";
   }

   return filtro.substring(0,filtro.length()-3)+" )";
 }


}



